package main

import (
	"fmt"
	"sync"
	"time"
)

func main()  {
	//不关心并发操作结果，或使用其他方法来收集结果，WaitGroup是等待一组并发操作完成的好方法
	//还可以使用channel和select语句
	//使用WaitGroup等待goroutine完成的基本例子：

	var wg sync.WaitGroup
	wg.Add(1)  //调用Add，参数为1，表示一个goroutine开始
	go func() {
		defer wg.Done()    //使用defer关键字来确保在goroutine退出前执行Done操作，向WaitGroup表明已经退出
		fmt.Println("1st goroutine sleeping...")
		time.Sleep(1)
	} ()

	wg.Add(1)  //调用Add，参数为1，表示一个goroutine开始
	go func() {
		defer wg.Done()
		fmt.Println("2nd goroutine sleeping...")
		time.Sleep(2)
	}()

	wg.Wait()  //执行Wait操作，将阻塞main goroutine，直到所有的goroutine表明他们已经退出
	fmt.Println("All goroutines complete.")


	hello := func(wg *sync.WaitGroup,id int) {
		defer wg.Done()
		fmt.Printf("Hello from %v!\n",id)
	}
	const numGreeters = 5
	//var wg sync.WaitGroup
	wg.Add(numGreeters)
	for i := 0;i < numGreeters;i++ {
		go hello(&wg,i+1)
	}
	wg.Wait()




}






